package com.hujun.controller;

import com.hujun.modules.common.utils.R;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/redisson")
public class RedissonController {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private RedissonClient redisson;

    /**
     * 可重入锁
     * @return
     */
    @RequestMapping("/reentrantLock")
    public R reentrantLock(){
        // 1、获取一把锁，只要锁的名字一样，就是同一把锁
        RLock lock = redisson.getLock("myLock");
        // 2、加锁
        lock.lock(); // 阻塞式等待。默认加的锁都是30秒时间。
        // ① 锁的自动续期，如果业务超长，运行期间自动给锁续上新的30s。不用担心业务时间长，锁自动过期被删掉
        // ② 加锁的业务只要运行完成，就不会给当前锁续期，即时不手动解锁，锁默认在30s以后自动删除。
        try {
            logger.debug("加锁成功，执行业务代码... {} {}", Thread.currentThread().getId(), Thread.currentThread().getName());
            // 模拟下业务的
            Thread.sleep(30000);
        } catch (Exception e){

        } finally {
            // 3、解锁
            logger.debug("释放锁... {} {}", Thread.currentThread().getId(), Thread.currentThread().getName());
            lock.unlock();
        }
        return R.ok();
    }

}
